package DataBase;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;


/**
 * 
 *
 * dbcp 实用类，提供了dbcp连接，不允许继承；
 * 
 * 该类需要有个地方来初始化 DS ，通过调用initDS 方法来完成，可以在通过调用带参数的构造函数完成调用，可以在其它类中调用，也可以在本类中加一个static{}来完成；
 */
public final class DbcpBean {
	/** 数据源，static */
	private static DataSource DS;

	/** 从数据源获得一个连接 */
	public Connection getConnection() {

		try {
			return DS.getConnection();
		} catch (SQLException e) {
			System.out.println("获得连接出错！");
			e.printStackTrace();
			return null;
		}
	}
	
	public DataSource getDataSource() {
		return DS;
	}

	/** 默认的构造函数 */
	public DbcpBean() {
		try {
			initDS("dbcpconfig.properties");            //载入外部配置文件
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/** 构造函数，初始化了 DS ，指定配置文件 */
	public DbcpBean(String propertyURL) {
		try {
			initDS(propertyURL);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/** 构造函数，初始化了 DS ，指定 所有参数 */
	public DbcpBean(String connectURI, String username, String pswd, String driverClass, int initialSize,
			int maxActive, int maxIdle, int maxWait) {
		initDS(connectURI, username, pswd, driverClass, initialSize, maxActive, maxIdle, maxWait);
	}

	/**
	 * 创建数据源，使用指定的配置文件；
	 * 
	 */
	public static void initDS(String propertyURL) throws IOException {
		Properties properties = new Properties();
		InputStream is = DbcpBean.class.getClassLoader().getResourceAsStream(propertyURL);
		properties.load(is);
		try {
			DS = BasicDataSourceFactory.createDataSource(properties);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/** 
	 * 指定所有参数连接数据源
	 * 
	 * @param connectURI 数据库
	 * @param username 用户名
	 * @param pswd 密码
	 * @param driverClass 数据库连接驱动名
	 * @param initialSize 初始连接池连接个数
	 * @param maxActive 最大激活连接数
	 * @param maxIdle 最大闲置连接数
	 * @param maxWait 获得连接的最大等待毫秒数
	 * @return
	 */
	public static void initDS(String connectURI, String username, String pswd, String driverClass, int initialSize,
			int maxActive, int maxIdle, int maxWait) {
		BasicDataSource ds = new BasicDataSource();
		ds.setDriverClassName(driverClass);
		ds.setUsername(username);
		ds.setPassword(pswd);
		ds.setUrl(connectURI);
		ds.setInitialSize(initialSize); // 初始的连接数；
		ds.setMaxActive(maxActive);
		ds.setMaxIdle(maxIdle);
		ds.setMaxWait(maxWait);
		DS = ds;
	}

	/** 获得数据源连接状态 */
	public static Map<String, Integer> getDataSourceStats() throws SQLException {
		BasicDataSource bds = (BasicDataSource) DS;
		Map<String, Integer> map = new HashMap<String, Integer>(2);
		map.put("active_number", bds.getNumActive());
		map.put("idle_number", bds.getNumIdle());
		return map;
	}

	/** 关闭数据源 */
	protected static void shutdownDataSource() throws SQLException {
		BasicDataSource bds = (BasicDataSource) DS;
		bds.close();
	}


}
